#include "lrcpage.h"
#include "ui_lrcpage.h"
#include<QPushButton>
#include<QFile>
#include<QDebug>

//////////////////////////////////////
//音乐歌词显示界面//////////////////////
/////////////////////////////////////

LrcPage::LrcPage(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::LrcPage)
{
    ui->setupUi(this);
    //设置窗口无标题栏
    setWindowFlag(Qt::FramelessWindowHint);
    //设置歌词页面的下移动画
    lrcAnimation=new QPropertyAnimation(this,"geometry",this);
    lrcAnimation->setDuration(500);
    lrcAnimation->setStartValue(QRect(9,9,width(),height()));
    lrcAnimation->setEndValue(QRect(9,9+height(),width(),height()));
    //点击隐藏歌词页面窗口的按钮的处理函数(以动画的方式缓慢隐藏)
    connect(ui->hideBtn,&QPushButton::clicked,this,[=]{
        lrcAnimation->start();  //点击隐藏歌词页面窗口的按钮时,启动下移歌词窗口页面
        //this->hide();动画结束隐藏
    });
    //当动画结束后,QPropertyAnimation类会发出finished的信号,此时要隐藏页面
    connect(lrcAnimation,&QPropertyAnimation::finished,this,[=]{
        this->hide();
    });
    //设置隐藏按钮的图标
    ui->hideBtn->setIcon(QIcon(":/image/hide.png"));
}

LrcPage::~LrcPage()
{
    delete ui;
}

//解析Lrc文件
bool LrcPage::parseLrc(QString lrcPath)
{
    //清除上一首的记录
    lrcLines.clear();
    //以只读方式打开文件
    QFile lrcFile(lrcPath);
    if(!lrcFile.open(QFile::ReadOnly))
    {
        qDebug()<<"读取文件失败";
        return false;
    }
    //按行读取文件中的每一行歌词时间+歌词
    while(!lrcFile.atEnd())
    {
        //从文件中读取一行数据
        QString lrcLine=lrcFile.readLine(1024);

        //解析时间和歌词的文本,用'[' 和 ']'分割时间和文本
        int left=0,right=0;
        left=lrcLine.indexOf('[');
        right=lrcLine.indexOf(']');

        //解析时间
        QString time=lrcLine.mid(left,right-left+1);//保存时间字符串
        qint64 lineTime=0;  //用于保存时间-->保存歌词对应的时间
        int begin=1,end=0;

        //在时间中解析分:秒:毫秒
        //解析分钟
        end=time.indexOf(":");
        lineTime+=time.mid(begin,end-begin).toInt()*60*1000;

        //解析秒
        begin=end+1;
        end=time.indexOf('.',begin);
        lineTime+=time.mid(begin,end-begin).toInt()*1000;

        //解析毫秒
        begin=end+1;
        end=time.indexOf('.',begin);
        lineTime+=time.mid(begin,end-begin).toInt();

        //解析歌词-->保存歌词
        QString lineText=lrcLine.mid(right+1,lrcLine.size()-right-1-1-1);//多-1是因为每行歌词的最后都有'\n'换行操作符

        //把这一行歌词放入lrcLines中
        lrcLines.push_back(LrcLine(lineTime,lineText));
    }
    for(auto word : lrcLines)
    {
        qDebug()<<word.lrcTime<<" "<<word.lrcText;
    }
    return true;
}

//根据当前时间获取对应歌词在LrcLines中的索引
int LrcPage::getLineLrcWordIndex(qint64 pos)
{
    //当前歌曲没有lrc歌词
    if(lrcLines.isEmpty())
    {
        return -1;
    }
    if(pos<lrcLines[0].lrcTime)
    {
        return 0;
    }
    //判断时间在第i-1行和第i行之间,第i-1行还没有播放完,返回第i-1行
    for(int i=1;i<lrcLines.size();i++)
    {
        if(pos>lrcLines[i-1].lrcTime&&pos<=lrcLines[i].lrcTime)
        return i-1;
    }
    //到最后一行唱完之后,歌曲结束了,但是还有收尾音乐,让歌词界面显示最后一行
    return lrcLines.size()-1;
}

//更据当前索引获取对应行的歌词
QString LrcPage::getLineLrcWord(int index)
{
    if(index<0||index>=lrcLines.size())
    {
        return "";
    }
    return lrcLines[index].lrcText;
}

//根据时间更新歌词页面的显示
void LrcPage::ShowLineLrcWord(int time)
{
    //根据当前时间获取对应歌词在LrcLines中的索引
    int index=getLineLrcWordIndex(time);
    //更新前三行,当前播放行,后三行到界面
    if(index==-1)
    {
        ui->line1->setText("");
        ui->line2->setText("");
        ui->line3->setText("");
        ui->lineCenter->setText("当前歌曲无歌词");
        ui->line4->setText("");
        ui->line5->setText("");
        ui->line6->setText("");
    }
    else
    {
        ui->line1->setText(getLineLrcWord(index-3));
        ui->line2->setText(getLineLrcWord(index-2));
        ui->line3->setText(getLineLrcWord(index-1));
        ui->lineCenter->setText(getLineLrcWord(index));
        ui->line4->setText(getLineLrcWord(index+1));
        ui->line5->setText(getLineLrcWord(index+2));
        ui->line6->setText(getLineLrcWord(index+3));
    }
}

//设置歌词页面中显示当前音乐的名称
void LrcPage::ShowLrcMusicName(QString name)
{
    ui->musicName->setText(name);
}


void LrcPage::ShowLrcMusicSinger(QString singer)
{
    ui->musicSinger->setText(singer);
}
